改了一百年终于过了
此题用链表可以更快一点
链表细节是真的多~~
先说明一下next是指向此数后面的类指针,prev是指向前面的类指针。(双向链表对吧)
主要函数1:
1 | void link(int x,int y) { |
用于将链表中的两点连起来
主要函数2:
我们用第一种,将x插入到y后面举例:
- 先把x的左右两边连起来(把x从原先位置拿出来)
- 再让y.prev(y的上一个数)和x连起来
- 最后把x和y连起来
注意:第2步和第3步不能交换(请读者思考)
以下为此函数代码:
1 | void op1(int x,int y) { |
后面两种情况思路大致相同
最后来说说操作4
这就是此题精髓之处
为了让我们的程序运行速度更快,我们不必每次遇到操作4都反转一次链表。想一想,反转一次后再翻转过来其实就是没反转,然而问题来了,操作1和2在这期间不会混乱吗?所以我们记录操作4操作操作的此数,在偶数次时正常操作,在奇数次时就反过来操作,即若是操作1就换成操作2,操作2的话就操作1。这样可以大大节省时间。
具体代码如下:
1 |
|